package com.joysuch.wwyt.util;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 短信发送
 *
 * @Author ZhangDong
 * @Date 2021/2/20 15:44
 */
@Slf4j
public class SmsUtil {

    /**
     * 发送消息
     *
     * @param phone           号码
     * @param verifyCode      验证码
     * @param accessKeyId     阿里云获取的访问API
     * @param accessKeySecret 密钥
     * @param signName        签名
     * @param templateCode    模板id
     * @return true 发送成功; false 发送失败
     */
    public static boolean sendSms(String phone, String verifyCode, String accessKeyId,
                                  String accessKeySecret, String signName, String templateCode) {
        // 初始化acsClient,需要填写自己的accessKeyId和accessSecret
        // regionId只有一个杭州,不支持其他地区
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);

        // 组装请求对象,这几项为默认的设置,不必修改
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        // 阿里云服务器域名
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");

        // 短信接收者手机号
        request.putQueryParameter("PhoneNumbers", phone);
        // 短信签名
        request.putQueryParameter("SignName", signName);
        // 模板ID
        request.putQueryParameter("TemplateCode", templateCode);

        // 构建短信模板参数替换,要求格式为json
        // 如果你的短信模板为：验证码为：${code},那么你的json为：{"code": "2345"}
        Map<String, String> jsonParam = new HashMap<>();
        jsonParam.put("verifyCode", verifyCode);

        //此处我用的json格式化的依赖是fastjson,SpringBoot自带的是jackson
        request.putQueryParameter("TemplateParam", JSON.toJSONString(jsonParam));
        // 发送请求并获取响应,判断是否成功
        try {
            CommonResponse response = client.getCommonResponse(request);
            if (response.getHttpResponse().isSuccess()) {
                return true;
            }
        } catch (ClientException e) {
            log.error("短消息发送失败:{}", e.getMessage());
        }
        return false;
    }

}
